package view.ventanas_principales.panels;

import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.hamcrest.core.IsNull;

import model.Clase2;
import model.Cursada;
import model.Horario;
import model.IRCursadaSala;
import model.IRHorarioCursada;
import model.Sala;
import model.comunication.IClase;
import model.comunication.ICursada;
import model.comunication.IHorario;
import model.comunication.IIRCursadaSala;
import model.comunication.IIRHorarioCursada;
import model.comunication.IInstructor;
import model.comunication.ISala;
import view.salas.CrearSala;
import view.salas.FormatoCeldaCursada;
import view.salas.FormatoColumnaDia;
import view.salas.FormatoNombreCursada;

import com.toedter.calendar.JCalendar;

import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;

import java.awt.Color;

import javax.swing.border.TitledBorder;

import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;

@SuppressWarnings("serial")
public class SalasPanel extends JPanel {
	private JTable tableSalas;
	private DefaultTableModel modeloTablaSala;
	private JTextField textFecha;
	private JCalendar calendar;
	private ISala cmmSala;
	@SuppressWarnings("rawtypes")
	private JComboBox comboSalas;
	@SuppressWarnings("rawtypes")
	private DefaultComboBoxModel modeloComboSala;
	private JLabel lblInfoSemanal;
	private IHorario cmmHorario;
	private ICursada cmmCursada;
	private IClase cmmClase;
	private IIRCursadaSala cmmIRCursadaSala;
	private IIRHorarioCursada cmmIRHorarioCursada;
	private Sala salita;

	/**
	 * Create the panel.
	 * 
	 * @throws ParseException
	 */
	public SalasPanel() throws ParseException {

		cmmCursada = ICursada.getInstance();
		cmmSala = ISala.getInstance();
		cmmIRCursadaSala = IIRCursadaSala.getInstance();
		cmmClase = IClase.getInstance();
		cmmIRHorarioCursada = IIRHorarioCursada.getInstance();
		cmmHorario = IHorario.getInstance();

		initialize();
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initialize() throws ParseException {
		setLayout(null);

		JLabel lblFecha = new JLabel("Fecha");
		lblFecha.setBounds(10, 157, 86, 14);
		add(lblFecha);

		lblInfoSemanal = new JLabel("New label");
		lblInfoSemanal.setBounds(433, 59, 322, 20);
		add(lblInfoSemanal);


		modeloComboSala = new DefaultComboBoxModel();
		comboSalas = new JComboBox(new DefaultComboBoxModel(new String[] {"-----------------------"}));

		comboSalas.setBounds(10, 70, 117, 20);
		add(comboSalas);

		JLabel lblSalas = new JLabel("Salas");
		lblSalas.setBounds(10, 45, 46, 14);
		add(lblSalas);

		textFecha = new JTextField();

		textFecha.setEditable(false);
		textFecha.setBounds(10, 182, 117, 20);
		add(textFecha);
		textFecha.setColumns(10);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBorder(null);
		scrollPane.setBounds(263, 90, 620, 236);
		add(scrollPane);

		tableSalas = new JTable();
		tableSalas.addMouseMotionListener(new MouseMotionAdapter() {
			@Override
			public void mouseMoved(MouseEvent evt) {

				int rowIndex = tableSalas.rowAtPoint(evt.getPoint());
				int colIndex = tableSalas.columnAtPoint(evt.getPoint());
				tableSalas.setToolTipText((String) tableSalas.getValueAt(rowIndex, colIndex));

				// TODO Para averiguar si es la celda de superposicion
				if (tableSalas.getSelectionBackground().equals(Color.black)) {

				}
			}
		});
		tableSalas.setModel(new DefaultTableModel(new Object[][] { { "8:00", null, null, null, null, null, null, null }, { "9:00", null, null, null, null, null, null, null },
				{ "10:00", null, null, null, null, null, null, null }, { "11:00", null, null, null, null, null, null, null }, { "12:00", null, null, null, null, null, null, null },
				{ "13:00", null, null, null, null, null, null, null }, { "14:00", null, null, null, null, null, null, null }, { "15:00", null, null, null, null, null, null, null },
				{ "16:00", null, null, null, null, null, null, null }, { "17:00", null, null, null, null, null, null, null }, { "18:00", null, null, null, null, null, null, null },
				{ "19:00", null, null, null, null, null, null, null }, { "20:00", null, null, null, null, null, null, null }, }, new String[] { "Horario\\Dias", "Lunes", "Martes", "Miercoles",
				"Jueves", "Viernes", "Sabado", "Domingo" }));
		scrollPane.setViewportView(tableSalas);
		modeloTablaSala = (DefaultTableModel) tableSalas.getModel();
		tableSalas.setModel(modeloTablaSala);
		// modeloTablaSala.fireTableDataChanged();//TODO probar si se actualiza la jtable

		salita = new Sala();

		calendar = new JCalendar();
		calendar.getYearChooser().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

		calendar.setBounds(10, 213, 243, 125);
		add(calendar);
		SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
		textFecha.setText(formatoDeFecha.format(calendar.getDate()));
		// Colocar primer y ultimo dia de la semana
		Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
		Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
		DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");// EEE dd/MM/yyy
		lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));

		// Pintar columna por fecha seleccionada Columna completa
		// FormatoColumnaDia fCd = new FormatoColumnaDia(queDiaColumnaTabla(calendar.getCalendar()));
		// tableSalas.getTableHeader().setDefaultRenderer(fCd);
		// tableSalas.setDefaultRenderer(Object.class, fCd);

//		llenarTablaDisponibilidad(salita);

		
//		Set<String> c = obtenerCursadaTabla();
//		System.out.println("Longitud del SET: "+c.size()+"Las cursadas en la tabla: " + c);
		
		
		
		
//		int i = 0;
//		for(String nombre : c){
//			FormatoNombreCursada fNc = new FormatoNombreCursada(nombre,i);
//			tableSalas.setDefaultRenderer(Object.class, fNc);
//			i++;
//		}
//		
		
		FormatoColumnaDia fcd = new FormatoColumnaDia();
		tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);

		comboSalas.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				List<Sala> salas = cmmSala.getAllSalas();

				if (comboSalas.getSelectedItem().equals("Todas")) {///Codigo muerto
					try {
						salita = new Sala();
						llenarTablaDisponibilidad(salita);
					} catch (ParseException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				} else {
					for (Sala sala : salas) {
						if (sala.getNombre().equals(comboSalas.getSelectedItem())) {

							salita = sala;
							break;
						}
					}
					try {
						llenarTablaDisponibilidad(salita);
					} catch (ParseException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

				}
				calendar.getMonthChooser().addPropertyChangeListener(new PropertyChangeListener() {
					public void propertyChange(PropertyChangeEvent evt) {
						if (evt.getPropertyName().compareTo("month") == 0) {
							SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
							textFecha.setText(formatoDeFecha.format(calendar.getDate()));
							// Colocar primer y ultimo dia de la semana
							Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
							Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
							DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
							lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
							try {
								llenarTablaDisponibilidad(salita);
							} catch (ParseException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}

							// Pintar columna por fecha seleccionada

							FormatoColumnaDia fcd = new FormatoColumnaDia();
							tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);

						}
					}
				});
				calendar.getYearChooser().addPropertyChangeListener(new PropertyChangeListener() {
					public void propertyChange(PropertyChangeEvent evt) {
						if (evt.getPropertyName().compareTo("year") == 0) {
							SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
							textFecha.setText(formatoDeFecha.format(calendar.getDate()));
							// Colocar primer y ultimo dia de la semana
							Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
							Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
							DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
							lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
							try {
								llenarTablaDisponibilidad(salita);
							} catch (ParseException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}

							// Pintar columna por fecha seleccionada

							FormatoColumnaDia fcd = new FormatoColumnaDia();
							tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);
						}
					}
				});
				calendar.getDayChooser().addPropertyChangeListener(new PropertyChangeListener() {
					public void propertyChange(PropertyChangeEvent evt) {
						if (evt.getPropertyName().compareTo("day") == 0) {
							SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
							textFecha.setText(formatoDeFecha.format(calendar.getDate()));
							// Colocar primer y ultimo dia de la semana
							Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
							Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
							DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
							lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
							try {
								llenarTablaDisponibilidad(salita);
							} catch (ParseException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}

							// Pintar columna por fecha seleccionada

							FormatoColumnaDia fcd = new FormatoColumnaDia();
							tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);

						}
					}
				});

			}
		});
		// Estan aca tambien ya que si no hay ningun evento del jcombobox no cambia la tabla(fue comentado este codigo porque era para pruebas)
//		calendar.getMonthChooser().addPropertyChangeListener(new PropertyChangeListener() {
//			public void propertyChange(PropertyChangeEvent evt) {
//				if (evt.getPropertyName().compareTo("month") == 0) {
//					SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//					textFecha.setText(formatoDeFecha.format(calendar.getDate()));
//					// Colocar primer y ultimo dia de la semana
//					Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
//					Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
//					DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
//					lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
//					try {
//						salaEspecifica = false;
//						llenarTablaDisponibilidad(salita);
//					} catch (ParseException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}
//
//					// Pintar columna por fecha seleccionada
//
//					FormatoColumnaDia fcd = new FormatoColumnaDia();
//					tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);
//
//				}
//			}
//		});
//		calendar.getYearChooser().addPropertyChangeListener(new PropertyChangeListener() {
//			public void propertyChange(PropertyChangeEvent evt) {
//				if (evt.getPropertyName().compareTo("year") == 0) {
//					SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//					textFecha.setText(formatoDeFecha.format(calendar.getDate()));
//					// Colocar primer y ultimo dia de la semana
//					Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
//					Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
//					DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
//					lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
//					try {
//						salaEspecifica = false;
//						llenarTablaDisponibilidad(salita);
//					} catch (ParseException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}
//
//					// Pintar columna por fecha seleccionada
//
//					FormatoColumnaDia fcd = new FormatoColumnaDia();
//					tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);
//
//				}
//			}
//		});
//		calendar.getDayChooser().addPropertyChangeListener(new PropertyChangeListener() {
//			public void propertyChange(PropertyChangeEvent evt) {
//				if (evt.getPropertyName().compareTo("day") == 0) {
//					SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//					textFecha.setText(formatoDeFecha.format(calendar.getDate()));
//					// Colocar primer y ultimo dia de la semana
//					Calendar calPrimerDia = firstDayOfWeek(calendar.getCalendar());
//					Calendar calUltimoDia = lastDayOfWeek(calendar.getCalendar());
//					DateFormat df = new SimpleDateFormat("EEEEEEEEE dd 'de' MMMMM");
//					lblInfoSemanal.setText(df.format(calPrimerDia.getTime()) + " - " + df.format(calUltimoDia.getTime()));
//					try {
//						llenarTablaDisponibilidad(salita);
//					} catch (ParseException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}
//
//					// Pintar columna por fecha seleccionada
//
//					FormatoColumnaDia fcd = new FormatoColumnaDia();
//					tableSalas.getColumnModel().getColumn(queDiaColumnaTabla(calendar.getCalendar()) + 1).setHeaderRenderer(fcd);
//
//				}
//			}
//		});

		JButton btnCrearSala = new JButton("Crear Sala");
		btnCrearSala.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				CrearSala crSala = new CrearSala();
				// modeloComboSala.addElement(idSala); // para que agregue automaticamente el item al comboSalas

			}
		});
		btnCrearSala.setBounds(10, 364, 117, 23);
		add(btnCrearSala);

		llenarComboSalas(comboSalas);

		JButton btnActualizarcombo = new JButton("actualizarCombo");
		btnActualizarcombo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				llenarComboSalas(comboSalas);
			}
		});
		btnActualizarcombo.setBounds(137, 364, 138, 23);
		add(btnActualizarcombo);

	}

	// llena el comboboxsala

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void llenarComboSalas(JComboBox comboSala) {
		comboSalas.removeAll();
		List<Sala> salas = cmmSala.getAllSalas();

		for (Sala sala : salas) {
			comboSala.addItem(sala.getNombre());
		}
	}

	/*
	 * 1 Domingo 2 Lunes 3 Martes 4 Miercoles 5 Jueves 6 Viernes 7 Sabado
	 */

	@SuppressWarnings("unused")
	public void llenarTablaDisponibilidad(Sala sala) throws ParseException {
		// vaciar tabla
		modeloTablaSala.setRowCount(0);
		// instanciar las filas con sus horarios
		tableSalas.setModel(new DefaultTableModel(new Object[][] { { "8:00", null, null, null, null, null, null, null }, { "9:00", null, null, null, null, null, null, null },
				{ "10:00", null, null, null, null, null, null, null }, { "11:00", null, null, null, null, null, null, null }, { "12:00", null, null, null, null, null, null, null },
				{ "13:00", null, null, null, null, null, null, null }, { "14:00", null, null, null, null, null, null, null }, { "15:00", null, null, null, null, null, null, null },
				{ "16:00", null, null, null, null, null, null, null }, { "17:00", null, null, null, null, null, null, null }, { "18:00", null, null, null, null, null, null, null },
				{ "19:00", null, null, null, null, null, null, null }, { "20:00", null, null, null, null, null, null, null }, }, new String[] { "Horario\\Dias", "Lunes", "Martes", "Miercoles",
				"Jueves", "Viernes", "Sabado", "Domingo" }));
		modeloTablaSala = (DefaultTableModel) tableSalas.getModel();
		tableSalas.setModel(modeloTablaSala);
		List<Cursada> cursadas = new ArrayList<Cursada>();

		if (isNull(sala) == true) {
			// TODO Despues hacerlo para que una cursada tenga salas multiples
			List<IRCursadaSala> irCursadaSalas = cmmIRCursadaSala.findAllXSala(sala.getId());
			// Sala sala = cmmSala.getSala(irCursadaSala.getidSala());
			for (IRCursadaSala irCursadaSala : irCursadaSalas) {
				Cursada c = cmmCursada.getCursada(irCursadaSala.getidCursada());
				cursadas.add(c);
			}
		} else {

			cursadas = cmmCursada.getAllCursadas();
		}

		if (cursadas != null) {
			for (Cursada cursada : cursadas) {

				// Date dia = cursada.getFechaInicioCursada().getTime();
				int fila = posicionFila(cursada.getFechaInicioCursada());
				// int cantClasesPorSemana = (cursada.getCantidadClases() * cursada.getHorasSemanales()) / cursada.getCurso().getHorasTotales();
				// int horasPorDia =

				List<Clase2> clases = cmmClase.findAll(cursada.getId());

				for (Clase2 clase : clases) {
					// String claseFecha;
					// SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
					// claseFecha = sdf.format(clase.getFecha().getTime());
					List<IRHorarioCursada> iRHorarioCursadas = cmmIRHorarioCursada.findAll(cursada.getId());

					Calendar fechaSeleccionada = pasarCalendar(textFecha.getText());
					Calendar calPrimerDia = firstDayOfWeek(fechaSeleccionada);
					Calendar calUltimoDia = lastDayOfWeek(fechaSeleccionada);

					FormatoCeldaCursada fCc;

					if (between(clase.getFecha().getTime(), calPrimerDia.getTime(), calUltimoDia.getTime())) {
						for (IRHorarioCursada irHorarioCursada : iRHorarioCursadas) {
							int idHorario = irHorarioCursada.getIdHorario();
							Horario horario = cmmHorario.getHorario(idHorario);

							int cantHoras = cantHorasXclase(horario.getDesde().getTime(), horario.getHasta().getTime());

							int nroDeDia = queDia(horario.getDia().toString());
							Date diaDeClase = clase.getFecha().getTime();

							if (getDayOfTheWeek(diaDeClase) == 1 && nroDeDia == 1) { // dia de la semana
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++)
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 7);

							} else if (getDayOfTheWeek(diaDeClase) == 2 && nroDeDia == 2) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									// if(i==0){
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 1);

									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(String.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
									// }
								}

							} else if (getDayOfTheWeek(diaDeClase) == 3 && nroDeDia == 3) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 2);
									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(Object.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
								}

							} else if (getDayOfTheWeek(diaDeClase) == 4 && nroDeDia == 4) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 3);
									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(Object.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
								}

							} else if (getDayOfTheWeek(diaDeClase) == 5 && nroDeDia == 5) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 4);
									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(Object.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
								}

							} else if (getDayOfTheWeek(diaDeClase) == 6 && nroDeDia == 6) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 5);
									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(Object.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
								}

							} else if (getDayOfTheWeek(diaDeClase) == 7 && nroDeDia == 7) {
								// System.out.println(getDayOfTheWeek(diaDeClase) + " Cursada: " + cursada.getCurso().getNombre() + " " + cursada.getFechaInicioCursada().get(Calendar.HOUR_OF_DAY) + ""
								// + claseFecha);
								for (int i = 0; i < cantHoras; i++) {
									modeloTablaSala.setValueAt(cursada.getCurso().getNombre(), fila + i, 6);
									// fCc = new FormatoCeldaCursada(1,cursada.getCurso().getNombre(),fila+i);
									// tableSalas.setDefaultRenderer(Object.class, fCc);
//									fCc = new FormatoCeldaCursada(nroDeDia - 1, cursada.getCurso().getNombre(), fila);
//									tableSalas.setDefaultRenderer(Object.class, fCc);
								}

							}

						}

					}

				}
			}
		}
	}

	public Set<String> obtenerCursadaTabla() {
		Set<String> cursadas = new HashSet<String>();

		for (int i = 1; i < modeloTablaSala.getRowCount(); i++) {
			for (int j = 1; j < modeloTablaSala.getColumnCount(); j++) {
				if (modeloTablaSala.getValueAt(i, j) != null) {
					String celda = modeloTablaSala.getValueAt(i, j).toString();
					cursadas.add(celda);
				}
			}
		}

		return cursadas;
	}

	public Calendar pasarCalendar(String fecha_string) throws ParseException {
		Calendar fecha_calendar = Calendar.getInstance();

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

		Date fecha_date = sdf.parse(fecha_string);
		fecha_calendar.setTime(fecha_date);
		return fecha_calendar;

	}

	public int posicionFila(Calendar cal) {
		int hora = cal.get(Calendar.HOUR_OF_DAY);
		int minutos = cal.get(Calendar.MINUTE);
		if (hora == 8) {
			return 0;
		} else if (hora == 9) {
			return 1;
		} else if (hora == 10) {
			return 2;
		} else if (hora == 11) {
			return 3;
		} else if (hora == 12) {
			return 4;
		} else if (hora == 13) {
			return 5;
		} else if (hora == 14) {
			return 6;
		} else if (hora == 15) {
			return 7;
		} else if (hora == 16) {
			return 8;
		} else if (hora == 17) {
			return 9;
		} else if (hora == 18) {
			return 10;
		} else if (hora == 19) {
			return 11;
		}
		return 12;
	}

	public static int getDayOfTheWeek(Date d) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTime(d);
		return cal.get(Calendar.DAY_OF_WEEK);
	}

	// TODO Areglar para horarios half : 9:30
	public int cantHorasXclase(Date inicio, Date fin) {

		int horaInicial = inicio.getHours();
		int horaFinal = fin.getHours();

		return horaFinal - horaInicial;
	}

	public Integer queDia(String dia) {
		if (dia.equals("domingo")) {
			return 1;
		} else if (dia.equals("lunes")) {
			return 2;
		} else if (dia.equals("martes")) {
			return 3;
		} else if (dia.equals("miercoles")) {
			return 4;
		} else if (dia.equals("jueves")) {
			return 5;
		} else if (dia.equals("viernes")) {
			return 6;
		} else if (dia.equals("sabado")) {
			return 7;
		}

		return 0; // si no coincide con nada
	}

	public Integer queDiaColumnaTabla(Calendar cal) {

		int dia = cal.get(Calendar.DAY_OF_WEEK);
		if (dia == 1) {
			return 6;
		} else if (dia == 2) {
			return 0;
		} else if (dia == 3) {
			return 1;
		} else if (dia == 4) {
			return 3;
		} else if (dia == 5) {
			return 3;
		} else if (dia == 6) {
			return 4;
		} else if (dia == 7) {
			return 5;
		}

		return 0; // si no coincide con nada
	}

	public boolean between(Date date, Date dateStart, Date dateEnd) {
		if (date != null && dateStart != null && dateEnd != null) {
			if (date.after(dateStart) && date.before(dateEnd)) {
				return true;
			} else if (date.equals(dateEnd) || date.equals(dateStart))
				return true;
			else {
				return false;
			}
		}
		return false;
	}

	public static Calendar lastDayOfWeek(Calendar calendar) {
		// Set the calendar to monday of the current week
		Calendar cal = (Calendar) calendar.clone();
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		for (int i = 0; i < 7; i++) {
			if (i == 6) {
				return cal;
			}
			cal.add(Calendar.DATE, 1);
		}
		return null;
	}

	public static Calendar firstDayOfWeek(Calendar calendar) {
		// Set the calendar to monday of the current week
		Calendar cal = (Calendar) calendar.clone();
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		// return dates of the current week starting on Monday
		return cal;

	}

	public boolean isNull(Sala s) {
		// if (s.getId() != 0 && s.getNombre() != null && s.getDescripcion() != null) {
		if (s.getId() != null) {
			return true;
		}
		return false;
	}
}
